package com.kjlink.internal.report4vue.config;


import cn.xuqiudong.common.base.model.BaseResponse;
import com.kjlink.internal.report4vue.base.model.ApiBaseResponse;
import org.springframework.core.MethodParameter;
import org.springframework.http.MediaType;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.server.ServerHttpRequest;
import org.springframework.http.server.ServerHttpResponse;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyAdvice;

/**
 * 描述:
 * 实现统一返回对象的转换。BaseResponse 转 ApiBaseResponse
 *
 * @author Vic.xu
 * @since 2024-11-22 17:45
 */
@ControllerAdvice(basePackages = "com.kjlink.internal.report4vue")
public class ApiResponseAdvice implements ResponseBodyAdvice<Object> {

    /**
     * 确定是否支持拦截当前的响应类型。
     *
     * @param returnType    控制器方法的返回值类型
     * @param converterType 处理该返回值的消息转换器类型
     * @return 如果返回值类型需要拦截，则返回 true；否则返回 false
     */
    @Override
    public boolean supports(MethodParameter returnType, Class<? extends HttpMessageConverter<?>> converterType) {
        // 判断是否需要处理 BaseResponse 类型的返回值
        return BaseResponse.class.isAssignableFrom(returnType.getParameterType());
    }


    /**
     * 拦截并转换响应体内容。
     *
     * @param body                  控制器方法的返回值（即响应体）
     * @param returnType            返回值的类型
     * @param selectedConverterType 被选中的消息转换器类型
     * @param selectedConverterType 返回值的内容类型（如 application/json）
     * @return 转换后的响应体对象
     */
    @Override
    public Object beforeBodyWrite(Object body,
                                  MethodParameter returnType,
                                  MediaType selectedContentType,
                                  Class<? extends HttpMessageConverter<?>> selectedConverterType,
                                  ServerHttpRequest request,
                                  ServerHttpResponse response) {
        // 判断返回值是否为 BaseResponse 类型
        if (body instanceof BaseResponse) {
            BaseResponse<?> baseResponse = (BaseResponse<?>) body;
            //  ApiBaseResponse
            return new ApiBaseResponse(baseResponse);
        }

        // 如果不是 BaseResponse 类型，直接返回原始 body
        return body;
    }


}